Organizations連携を使って、Amazon Inspector を組織レベルで有効化する [Terraform]
どうも、ちゃだいん(@chazuke4649)です。
基本的にTerraformで、Amazon Inspector を組織レベルで有効化してみたいと思います。
以下ブログで紹介していることを、極力Terraformでやってみるといった感じです。
前提
- すでにAWS Organizationsは有効化済み
- Inspector管理者はAuditアカウントへ委任する
- スキャンタイプは全て有効化する
- 対象リージョンは、2リージョン(東京とバージニア北部)
組織管理アカウント
- AccountId:
000000000000
- Terraform: v1.0.10
- aws provider: v4.63.0
Auditアカウント
- AccountId:
999999999999
- Terraform: v1.0.10
- aws provider: v4.67.0
ディレクトリ構成
組織管理アカウントとAuditアカウントで、Stateファイルおよび実行単位は分割している状態です。
% tree -L 2 . ├── audit │ ├── backend.tf │ ├── provider.tf │ └── inspector.tf ├── master │ ├── backend.tf │ ├── provider.tf │ ├── org.tf │ └── inspector.tf
手順
組織管理アカウントとAuditアカウントの両方で作業が必要となりますが、手順は以下の通りです。
[コンソール操作]とコメントがないものは、Terraformにて実施します。
- 組織管理アカウント) 信頼されたアクセスを有効化する
- 組織管理アカウント) Inspectorの有効化・管理アカウントの委任する
- Auditアカウント) Inspectorの有効化する
- Auditアカウント) 組織設定を追加する
- Auditアカウント) Lambdaコードスキャンを有効化する [コンソール操作] ※最近でたやつなのでTerraform未サポート
- 組織設定を変更する
- Auditアカウント自体に適用する
- Auditアカウント) メンバーアカウントを追加する [コンソール操作]
1. 組織管理アカウント)信頼されたアクセスを有効化する
AWS OrgazationsのAWSサービス連携にて、Inspectorの信頼されたアクセスを有効化させます。
既存のTerraformコードの当該箇所に、 inspector2.amazonaws.com
を追加します。
############################################################################### # AWS Organizations ############################################################################### resource "aws_organizations_organization" "org" { aws_service_access_principals = [ "config.amazonaws.com", "member.org.stacksets.cloudformation.amazonaws.com", "ram.amazonaws.com", "sso.amazonaws.com", "guardduty.amazonaws.com", "securityhub.amazonaws.com", "cloudtrail.amazonaws.com", "config-multiaccountsetup.amazonaws.com", "malware-protection.guardduty.amazonaws.com", "inspector2.amazonaws.com", ## <== ここを追加する ] enabled_policy_types = [ "SERVICE_CONTROL_POLICY" ] feature_set = "ALL" }
これを適用すると、以下の通りになります。
2. 組織管理アカウント) Inspectorの有効化・Inspector管理アカウントの委任する
2023.8.31追記)Service linked Roleが必要なため、組織管理アカウント自体のInspectorの有効化も行なっていましたが、委任完了後に `aws_inspector2_enabler`リソースに対するプランがAccess Denyされることが判明しました(組織管理アカウントのアクティブ化もAuditからしか操作できなくなるため)。暫定対応として当該リソースをTerraform管理外に外せば解消されますが、そもそも当該工程はTerraformで実行・管理する相性が良くないと思われます。結論としては、2.の工程は「マネジメントコンソールから実施する」をオススメします。コンソールからの手順は先述のブログか公式ドキュメントをご覧ください。参考までに当初内容は以下残しておくこととします。
続いて、Inspectorの有効化とInspector管理アカウントをAuditアカウントへ委任します。
作業前に、Inspectorコンソールを確認すると以下の通り、何もさわっていない状態です。
さらに左ペインから「アクティブ化」を開くと、アクティブ化がされていなく、委任された管理者も未設定であることがわかります。
Terraformコードは以下2点です。
provider "aws" { region = "ap-northeast-1" } provider "aws" { alias = "us-ea-1" region = "us-east-1" }
############################################################################### # Inspector ############################################################################### #-------------------------------------------------- # Tokyo #-------------------------------------------------- resource "aws_inspector2_enabler" "ap_ne_1" { account_ids = ["000000000000"] resource_types = ["EC2", "ECR", "LAMBDA"] } resource "aws_inspector2_delegated_admin_account" "ap_ne_1" { account_id = "999999999999" depends_on = [aws_inspector2_enabler.ap_ne_1] } #-------------------------------------------------- # Virginia #-------------------------------------------------- resource "aws_inspector2_enabler" "us_ea_1" { account_ids = ["000000000000"] resource_types = ["EC2", "ECR", "LAMBDA"] } resource "aws_inspector2_delegated_admin_account" "us_ea_1" { provider = aws.us-ea-1 account_id = "999999999999" depends_on = [aws_inspector2_enabler.us_ea_1] }
今回は対象が2リージョンなので、2リージョン分のproviderブロックを用意し、resourceブロックも2リージョン分作成します。
これを適用すると、以下の通りAuditアカウントへ管理者が委任されました。
※ 管理者を委任したためか、組織管理アカウントのInspectorアクティブ化は完了していません。これはこの後Auditアカウント側から行います。
3. Auditアカウント) Inspectorの有効化する
マネジメントコンソールやTerraform実行環境・ディレクトリ・認証情報をAuditアカウントに切り替えます。
AuditアカウントのInspectorコンソールを開くと、まだアクティブ化されていません。(※マネジメントコンソール操作のみであれば、管理者委任時と同時にアクティブ化もされます)
それではTerraformコードは以下となります。 また、便宜上「4. Auditアカウント) 組織設定を追加する」の手順も一緒にやってしまいます。
※ Auditアカウント側でもprovider.tfは組織管理アカウントと同様に、2つ用意しています。
############################################################################### # Inspector ############################################################################### #-------------------------------------------------- # Tokyo #-------------------------------------------------- resource "aws_inspector2_enabler" "ap_ne_1" { account_ids = ["999999999999"] resource_types = ["EC2", "ECR", "LAMBDA"] } resource "aws_inspector2_organization_configuration" "ap_ne_1" { auto_enable { ec2 = true ecr = true lambda = true } depends_on = [aws_inspector2_enabler.ap_ne_1] } #-------------------------------------------------- # Virginia #-------------------------------------------------- resource "aws_inspector2_enabler" "us_ea_1" { provider = aws.us-ea-1 account_ids = ["999999999999"] resource_types = ["EC2", "ECR", "LAMBDA"] } resource "aws_inspector2_organization_configuration" "us_ea_1" { provider = aws.us-ea-1 auto_enable { ec2 = true ecr = true lambda = true } depends_on = [aws_inspector2_enabler.us_ea_1] }
これを適用すると、Inspectorがアクティブ化されました。
組織設定もONになっています。
5. Auditアカウント) Lambdaコードスキャンを有効化する [コンソール操作]
今回現時点でのすべてのスキャンを有効化したいのですが、現時点のaws providerではLambdaのコードスキャンは未サポートでした。
よって、そこはコンソール操作にて実施します。
まず、「アカウント管理」にて、外れていた「Lambdaコードスキャン」にチェックを入れて、保存します。
続いて、Auditアカウント自体もLambdaコードスキャン」はOFF状態になっているため
Auditアカウントを選択し、「アクティブ化」ボタンにて、Lambdaコードスキャンを選択し、submitします。
これによって、Lambda標準スキャンもコードスキャンもアクティブ化されました。
この作業を、対象リージョン分(今回は東京とバージニア北部)だけ、繰り返し実施する必要があります。
6. Auditアカウント) メンバーアカウントを追加する [コンソール操作]
さて、最後に、コンソールからメンバーアカウントをアクティブ化させてます。
今回は、組織管理アカウントを含む3アカウントを選択し、全てのスキャンでsubmitします。
実行すると、ステータスがActivating
になり
最終的に3つのアカウントが正常にアクティブ化されました。
この作業を、対象リージョン分(今回は東京とバージニア北部)だけ、繰り返し実施する必要があります。
おまけ)メンバーアカウントを非アクティブ化する
コスト削減などでInspector利用アカウントをしぼる場合、Auditアカウントのコンソールから簡単に行えます。
対象の1アカウントを選択し、「アクション」から「全てのスキャン」を選択し
「非アクティブ化」を実行します。
そうすれば、対象アカウントはDeactivated
なステータスに変更されました。
まとめ
できるだけTerraformにて組織レベルでInspectorを有効化してみました。
Security HubやGuardDutyと同様に、現時点ではTerraformのみではなく、マネコンやCLIを組み合わせて実施するのが現実的と思われました。(いつかTerraform一撃でできる日に期待)
それでは今日はこの辺で。ちゃだいん(@chazuke4649)でした。